﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.PermisosModule.Entities;
using Cesave.Domain.Core;
using System.Data;

namespace Cesave.Domain.PermisosModule.Contracts.Variedades
{
	/// <summary>
	/// Implementación del servicio de variedades.
	/// </summary>
	public class VariedadService
		: IVariedadService
	{
		#region Private properties

		/// <summary>
		/// Repositorio de variedades.
		/// </summary>
		private IVariedadRepository _variedadRepository;

		#endregion

		#region Constructor

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="variedadRepository">
		/// Repositorio de variedades
		/// </param>
		public VariedadService(IVariedadRepository variedadRepository)
		{
			if (variedadRepository == null)
				throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "variedadRepository");
			_variedadRepository = variedadRepository;
		}

		#endregion

		#region IVariedadService Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="variedad"></param>
		public void AddVariedad(Entities.Variedad variedad)
		{
			if (variedad == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "variedad");
			IUnitOfWork unitOfWork = _variedadRepository.StoreContext;
			_variedadRepository.Add(variedad);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="variedad"></param>
		public void ChangeVariedad(Entities.Variedad variedad)
		{
			if (variedad == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "variedad");
			IUnitOfWork unitOfWork = _variedadRepository.StoreContext;
			_variedadRepository.Modify(variedad);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivoGuid"></param>
		/// <returns></returns>
		public List<Entities.Variedad> FindVariedadesByCultivo(Guid cultivoGuid)
		{
			if (cultivoGuid == Guid.Empty)
				throw new ArgumentException(Messages.exception_InvalidArgument, "cultivoGuid");
			VariedadesByCultivoSpecification specification = new VariedadesByCultivoSpecification(cultivoGuid);
			return _variedadRepository.FindVariedadesByCultivo(specification).ToList();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivoGuid"></param>
		/// <param name="status"></param>
		/// <returns></returns>
		public List<Entities.Variedad> FindVariedadesByCultivoAndStatus(Guid cultivoGuid, bool status = true)
		{
			if (cultivoGuid == Guid.Empty)
				throw new ArgumentException(Messages.exception_InvalidArgument, "cultivoGuid");
			return _variedadRepository.FindVariedadesByCultivoAndStatus(
				new VariedadesByCultivoSpecification(cultivoGuid),
				new VariedadesByStatusSpecification(status)
			).ToList();
		}

		#endregion

		#region IDisposable Members

		public void Dispose()
		{
			if (_variedadRepository != null && _variedadRepository.StoreContext != null)
				_variedadRepository.StoreContext.Dispose();
		}

		#endregion
	}
}
